home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / dviware / dvi2xx / findfile.c < prev    next >
C/C++ Source or Header  |  1994-04-24  |  6KB  |  325 lines

  1. #include "config.h"
  2. #include <string.h>
  3. #include <stdio.h>
  4. #ifndef vms
  5. #include <sys/types.h>
  6. #include <sys/stat.h>
  7. #else
  8. #include <types.h>
  9. #include <stat.h>
  10. #endif
  11.  
  12. int stat();
  13.  
  14. char *path_segment();
  15. char *pprint();
  16. extern void  Warning();
  17. extern bool  G_quiet;
  18. extern int   Debug;
  19.  
  20. #ifdef MAKETEXPK
  21. extern bool    makeTexPK ;
  22. #endif
  23.  
  24. #ifdef unix
  25. #ifdef DO_SUBDIRECTORIES
  26. #include <glob.h>
  27. #endif
  28. #endif
  29.  
  30. #ifdef unix
  31.   static char* raster_table[] = {
  32. #ifdef USEPXL
  33.     "%P/%N.%Rpk",
  34.     "%P/%N.%Rpxl",
  35.     "%P/dpi%R/%N.pk",
  36.     "%P/%R/%N.pxl",
  37.     "%P/dpi%R/%N.pxl",
  38.     "%P/pxl%M/%N.pk",
  39.     "%P/pxl%M/%N.pxl",
  40.     "%P/%N.%R",
  41. #else
  42.     "%P/%N.%Rgf",
  43.     "%P/%N.%Mgf",
  44. #endif
  45.     NULL
  46.   };
  47. #endif
  48.  
  49. #ifdef vms
  50.   static char* raster_table[] = {
  51. #ifdef USEPXL
  52.     "%P[%R]%N.pk;",
  53.     "%P%N.%Rpk;",
  54.     "%P:[%R]%N.pk;",
  55.     "%P:%N.%Rpk;",
  56.     "%P[%R]%N.pk;",
  57.     "%P%N.%Mpxl;",
  58.     "%P:[%M]%N.pxl;",
  59.     "%P:%N.%Mpxl;",
  60. #else
  61.     "%P%N.%Rgf;",
  62.     "%P:%N.%Rgf;",
  63.     "%P%N.%Mgf;",
  64.     "%P:%N.%Mgf;",
  65. #endif
  66.     NULL
  67.   };
  68. #endif
  69.  
  70. #ifdef MSDOS
  71.   static char* raster_table[] = {
  72. #ifdef USEPXL
  73.     "%P/dpi%R/%N.pk",
  74.     "%P/%R/%N.pk",
  75.     "%P/dpi%R/%N.pxl",
  76.     "%P/%R/%N.pxl",
  77.     "%P/pxl%M/%N.pk",
  78.     "%P/pxl%M/%N.pxl",
  79.     "%P/%N.%R",
  80. #else
  81.     "%P/%R/%N.gf",
  82.     "%P/dpi%R/%N.gf",
  83.     "%P/pxl%M/%N.gf",
  84. #endif
  85.     NULL
  86.   };
  87. #endif
  88.  
  89. #ifdef _AMIGA
  90.   static char* raster_table[] = {
  91. #ifdef USEPXL
  92.     "%P/%N.%Rpk",
  93.     "%P/%N.%Rpxl",
  94.     "%P/dpi%R/%N.pk",
  95.     "%P/%R/%N.pxl",
  96.     "%P/dpi%R/%N.pxl",
  97.     "%P/pxl%M/%N.pk",
  98.     "%P/pxl%M/%N.pxl",
  99.     "%P/%R/%N.%Rpk",
  100.     "%P/%N.%R",
  101. #else
  102.     "%P/%N.%Rgf",
  103.     "%P/%N.%Mgf",
  104. #endif
  105.     NULL
  106.   };
  107. #endif
  108.  
  109.  
  110.  
  111.  
  112. bool
  113. findfile(path,n,fontmag,name,tfm,level)
  114. char path[STRSIZE];   /* PIXEL path */
  115. char n[STRSIZE];      /* name of font */
  116. long fontmag;         /* magnification */
  117. char name[STRSIZE];   /* full name of PXL file  (returned) */
  118. bool tfm;             /* are we searching for a tfm file? */
  119. int level;            /* recursion level to prevent calling of MakeTeXPK */ 
  120. {
  121.   char local_path[STRSIZE];
  122. #ifdef MAKETEXPK
  123.   char MakePKCommand[STRSIZE];
  124. #endif
  125.   char *pathpt;
  126.   struct stat s;
  127.   int resolution, i;
  128.   char **pattern;
  129.  
  130.   if (tfm) {
  131.     resolution = 0; /* dont'care */
  132. #ifdef DEBUG
  133.     if (Debug) 
  134.       fprintf(stderr, 
  135.           "locating tfm %s, path %s, depth=%d\n",
  136.           n, path, level);
  137. #endif
  138.   } else {
  139.     resolution = (int)(fontmag/5.0 + 0.5);
  140. #ifdef DEBUG
  141.     if (Debug) 
  142.       fprintf(stderr, 
  143.           "locating raster %s, resolution %d on path %s, depth=%d\n",
  144.           n, resolution, path, level);
  145. #endif
  146.   }
  147.  
  148.  
  149. #ifndef vms
  150.     for( i=0; (pathpt = path_segment(i, path, local_path)) != NULL; i++) {
  151.       if (tfm) {
  152.     if (!stat( pprint(name,"%P/%N.tfm",pathpt,n,resolution,fontmag), &s))
  153.       return(TRUE);
  154.       } else {
  155.     for (pattern = raster_table; *pattern; pattern++) {
  156.       if (!stat( pprint(name,*pattern,pathpt,n,resolution,fontmag), &s))
  157.         return(TRUE);
  158.     }
  159.       }
  160.     }
  161. #else
  162.   if (tfm) {
  163.     if ( !stat(pprint(name,"%P/%N.tfm",pathpt,n,resolution,fontmag), &s))
  164.       return(TRUE);
  165.   } else {
  166.     for (pattern = raster_table; *pattern; pattern++) {
  167.       if (!stat( pprint(name,*pattern,path,n,resolution,fontmag), &s))
  168.     return(TRUE);
  169.     }
  170.   }
  171. #endif
  172.  
  173. #ifdef FUTURE
  174.     for(i=0; (pathpt=path_segment((bool)(i==0),VFPATH,local_path))!=NULL;i++) {
  175.       sprintf(name,"%s/%s.vfm",pathpt,n);
  176.       printf("searching virtual font <%s>\n",name);
  177.       if (stat(name,&s) == 0) return(TRUE);
  178.     }
  179. #endif
  180.  
  181. #ifdef DO_SUBDIRECTORIES
  182.   if (level < MAX_SUBDIR_SEARCH_DEPTH) {
  183.     for( i=0; (pathpt = path_segment(i, path, local_path)) != NULL; i++) {
  184.       glob_t globbuf;
  185.       char   glob_path[STRSIZE + 3];
  186.       int    i;
  187.       sprintf( glob_path, "%s/*", pathpt );
  188.       if (glob( glob_path, 0, NULL, &globbuf ) == 0) {
  189.     for (i = 0; i < globbuf.gl_pathc; i++) {
  190.       if ((stat( globbuf.gl_pathv[i], &s) == 0) && S_ISDIR(s.st_mode)) {
  191.         if (findfile(globbuf.gl_pathv[i],
  192.              n,
  193.              fontmag,
  194.              name,
  195.              tfm,
  196.              level+1 ) == TRUE) {
  197.           globfree( &globbuf );
  198.           return(TRUE);
  199.         }
  200.       }
  201.     }
  202.     globfree( &globbuf );
  203.       }
  204.     }
  205.   } else {
  206.     Warning("maximal searchdepth (%d) exceeded, path=%s",
  207.         MAX_SUBDIR_SEARCH_DEPTH, path);
  208.   }
  209. #endif
  210.  
  211. #ifdef MAKETEXPK
  212.   if (makeTexPK && level == 0 && !tfm) {
  213.     sprintf(MakePKCommand,"%s %s %d %d %.4f %s",MAKETEXPK,
  214.         n,resolution,RESOLUTION,
  215.         (float)((float)resolution/RESOLUTION),MFMODE);
  216.     if (!G_quiet) 
  217.       fprintf(stderr,"calling: %s\n",MakePKCommand);
  218.     system(MakePKCommand);
  219.     if (findfile(path,n,fontmag,name,tfm,1)) 
  220.       return(TRUE);
  221.   }
  222. #endif
  223.  
  224.   if (level == 0) {
  225.     /* return error message */
  226.     if (tfm) {
  227.       sprintf(name, "tfm file not found: path=%s, name=%s", path,n);
  228.     } else {
  229.       sprintf(name,
  230. #ifdef USEPXL
  231.      "pk or pxl font not found: path=%s, name=%s, resolution=%d, magn=%ld",
  232. #else
  233.      "gf font not found: path=%s, name=%s, resolution=%d, magn=%ld",
  234. #endif
  235.       path,n,resolution,fontmag);
  236.     }
  237.   }
  238.   return(FALSE);
  239. }
  240.  
  241.  
  242. char *
  243. pprint (buffer, input, path, name, resolution, fontmag)
  244. char *buffer;
  245. char *input;
  246. char *path;
  247. char *name;
  248. int  resolution;
  249. long fontmag;
  250. {
  251.   char *output = buffer;
  252.   
  253.   /*  fprintf(stderr, "pprint called with <%s>\n", input);*/
  254.   for (; *input != '\0'; input++)
  255.     {
  256.       if (*input == '%') {
  257.     switch (*(++input)) 
  258.       {
  259.       case 'P':
  260.         strcpy(output, path);
  261.         output += strlen(output);
  262.         break;
  263.  
  264.       case 'N':
  265.         strcpy(output, name);
  266.         output += strlen(output);
  267.         break;
  268.  
  269.       case 'R':
  270.         sprintf(output, "%d", resolution);
  271.         output += strlen(output);
  272.         break;
  273.  
  274.       case 'M':
  275. #ifdef vms
  276.         sprintf(output, "%d", fontmag);
  277. #else
  278.         sprintf(output, "%ld", fontmag);
  279. #endif
  280.         output += strlen(output);
  281.         break;
  282.  
  283.       default:
  284.         *output++ = '%';
  285.         *output++ = *input;
  286.         break;
  287.       }
  288.       } else {
  289.     *output++ = *input;
  290.       }
  291.     }
  292.   *output = '\0';
  293.   /* fprintf(stderr, "pprint returns <%s>\n", buffer); */
  294.   return buffer;
  295. }
  296.  
  297.  
  298. char *
  299. path_segment(index,full_path,local_path)
  300. int index;
  301. char *full_path, *local_path;
  302. {
  303.   static char *pppt;
  304.   char *pathpt;
  305.  
  306.   if (index == 0) pathpt = strcpy(local_path,full_path);
  307.   else pathpt = pppt;
  308.   if (pathpt != NULL) {
  309. #ifdef unix
  310.     pppt = strchr(pathpt , ':' );
  311. #else
  312.     pppt = strchr(pathpt , ';' );
  313. #endif
  314.     if (pppt != NULL) {
  315.       *pppt = '\0';
  316.       pppt++;
  317.     }
  318.   }
  319.   return pathpt;
  320. }
  321.  
  322.  
  323.  
  324.  
  325.